package com.dycong.common.leetcode;

public class HammingDistance_461 {

    public static void main(String[] args) {
        HammingDistance_461 hammingDistance_461 = new HammingDistance_461();
        System.out.println(hammingDistance_461.hammingDistance(2323, 2232));
    }

    /**
     * todo 先将两个数异或运算得到n，那么n里面1的个数就是结果，如果n不为0，那么n至少有一位是1。
     * todo 如果n减1，那么原来处在整数最右边的1就会变为0，原来在1后面的所有的0都会变成1。其余所有位将不会受到影响。这样右边这部分的&运算结果就为0，然后循环
     * int n=x^y;
     * int count=0;
     * while(n!=0){
     * count++;
     * n=n&(n-1);
     * }
     * return count;
     */
    public int hammingDistance(int x, int y) {
        int xor = x ^ y;
        int i = 0;
        for (; xor != 0; i++) {
            xor = xor & (xor - 1);
        }
        return i;
    }

    public int hammingDistance2(int x, int y) {
        int i = 0;
        for (; x != 0 || y != 0; ) {
            if ((x & 1) != (y & 1)) {
                ++i;
            }
            x = x >> 1;
            y = y >> 1;
        }
        return i;
    }
}
